/**
 * MIT License
 * 
 * Copyright (c) 2024 - present @ ebraid
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#ifndef __EB_TASK_H__
#define __EB_TASK_H__

#include <types.h>

#ifdef __cplusplus
extern "C" {
#endif


/**
 * task function pointer to argument
 */
typedef void (*task_func_t)(void *arg);


/**
 * task handle, you can get it from task_create or task_create_static
 * if you want to delete it, you must call task_delete
 */
typedef void *task_t;


/**
 * @brief dynamatic create a task
 * @param task_func task function
 * @param name task name
 * @param stack_size stack size
 * @param arg task argument
 * @param priority task priority
 * @return task handle
 */
task_t task_create(task_func_t task_func, const char *name, int stack_size, void *arg, int priority);


/**
 * @brief dynamatic create a task
 * @param task_func task function
 * @param name task name
 * @param stack task stack
 * @param stack_size stack size
 * @param arg task argument
 * @param priority task priority
 * @return task handle
 */
task_t task_create_static(task_func_t task_func, const char *name, void *stack, int stack_size, void *arg, int priority);


/**
 * @brief delete a task
 * @param handle task handle
 * @return none
 */
void task_delete(task_t handle);


/**
 * @brief start scheduler
 * @param none
 * @return none
 * @note this function will not return
 */
void task_start_scheduler(void);


/**
 * @brief delay a task
 * @param milliseconds delay time
 * @return none
 */
void task_delay(int milliseconds);


/**
 * @brief enter critical section
 * @param none
 * @return none
 */
void enter_critical(void);


/**
 * @brief exit critical section
 * @param none
 * @return none
 */
void exit_critical(void);



#ifdef __cplusplus
}
#endif

#endif